package com.tantan.client;

import com.tantan.model.User;
import com.tantan.model.UserMessage;

import java.io.*;
import java.util.LinkedList;
import java.util.List;

import static com.tantan.client.ClientScanner.gteScanner;
//import java.util.Scanner;

/**
 * 编程实现客户端主界面绘制的功能和相应功能的实现
 */
public class ClintView {

    /**
     * 为了可以使用输入输出流，采用合成复用原则实现
     */
    private ClientInitClose cic ;
    /**
     * 自定义User类集合用来装User类对象
     */
    private List<User> studentUserList = new LinkedList<>();

    /**
     * 通过构造方法实现成员变量的初始化
     * @param cic
     */
    public ClintView(ClientInitClose cic) {
        this.cic = cic;
    }

    /**
     * 自定义成员方法实现客户端主界面的绘制
     */
    public void clientMainPage() throws IOException, ClassNotFoundException {
        while (true) {
            System.out.println("         \n\n\t\t\t在线考试系统");
            System.out.println("---------------------------------------");
            System.out.print("   [1] 学员系统");
            System.out.println("    [2] 管理员系统");
            System.out.println("   [0] 退出系统");
            System.out.println("---------------------------------------");
            System.out.println("请选择要进行的业务编号:");
            //Scanner sc = new Scanner(System.in);
            //int choose = sc.nextInt();
            int choose = gteScanner().nextInt();
            //当项目启动时，将文件中的所有学员账户信息全部读取出来放到一个List集合中。
//            StudentInformationLoading();
            switch (choose) {
                case 1:
                    System.out.println("---------------------------------------");
                    System.out.println("[1] 登录学员账户        [2] 注册学员账户");
                    System.out.println("[3] 退出学员系统");
                    System.out.println("---------------------------------------");
                    int choose2 = gteScanner().nextInt();
                    switch (choose2) {
                        case 1:
                            //学员登录
                            boolean b = clientStudentLogin();
                            //开始考试
                            System.out.println("下面开始考试：");
                            if(b){
                                Exam e = new Exam();
                                e.startTest();
                            }
                            break;
                        case 2:
                            //学员信息注册
                            StudentAccountRegistration();
                            break;
                        case 3:
                            //退出学员系统
                            System.out.println("正在退出学员系统...");
                            return;
                        default:
                            System.out.println("输入错误！");
                    }
                    break;
                case 2:
                    //管理员登录
                    boolean b2 = clientManagerLogin();
                    if(b2){
                        System.out.println("---------------------------------------");
                        System.out.println("   [1] 学员管理模块   [2] 考题管理模块");
                        System.out.println("---------------------------------------");
                        System.out.println("请输入要进行的业务：");
                        int choose1 = ClientScanner.gteScanner().nextInt();
                        switch (choose1){
                            case 1:
                                System.out.println("正在进入学员管理模块...");
                                StudentManagement sm = new StudentManagement(cic);
                                sm.studentManagementPage();
                                break;
                            case 2:
                                System.out.println("正在进入考题管理模块...");
                                ExaminationQuestionsManagement eqm = new ExaminationQuestionsManagement();
                                eqm.examinationQuestionManagementPage();
                                break;
                            default:
                                System.out.println("输入错误！");
                        }
                    }
                    break;
                case 0:
                    System.out.println("正在退出系统...");
                    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\fileTest\\student.txt"));
                    oos.writeObject(studentUserList);
                    return;
                default:
                    System.out.println("输入错误，请重新选择：");
            }
        }
    }

    /**
     * 自定义成员方法实现学员账户信息的注册
     */
    private void StudentAccountRegistration() throws IOException {
        //学员的账户信息的正则表达式：[a-z]
        String userNameRegex = "^[a-z]{6}$";
        //学员的密码信息的正则表达式:6位数字
        String passwordRegex = "^\\d{6}$";
        //1.准备学员登录的相关数据
        System.out.println("请输入学员的账户信息（六位）：");
        String userName = gteScanner().next();
        System.out.println("请输入学员的密码信息（六位数字）：");
        String password = gteScanner().next();
        //2.判断输入的信息是否符合正则表达式，符合则将数据记录到studentUserList集合中
        if(userName.matches(userNameRegex) && password.matches(passwordRegex)){
            User user = new User(userName,password);
            studentUserList.add(user);
//            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\fileTest\\student.txt"));
//            oos.writeObject(studentUserList);
            System.out.println("注册成功,欢迎使用！");
        }else{
            System.out.println("格式错误，注册失败！");
        }
    }

    /**
     * 自定义成员方法实现客户端学员登录的功能
     */
    private boolean clientStudentLogin() throws IOException, ClassNotFoundException {
        //1.准备学员登录的相关数据
        System.out.println("请输入学员的账户信息：");
        String userName = gteScanner().next();
        System.out.println("请输入学员的密码信息：");
        String password = gteScanner().next();
        UserMessage tum = new UserMessage("userCheck",new User(userName,password));
        //2.将UserMessage类的对象通过对象输出流发送到服务器
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送学员账户信息成功！");
        //3接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        if("success".equals(tum.getType())){
            System.out.println("登陆成功，欢迎使用！");
            return true;
        }else{
            System.out.println("用户名或密码错误！");
            return false;
        }
    }

    /**
     * 自定义成员方法实现当项目启动时，将文件中的所有学员账户信息全部读取出来放到一个List集合中。
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
//    private List<User> StudentInformationLoading() throws IOException, ClassNotFoundException {
//        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\fileTest\\student.txt"));
//        studentUserList.add((User) ois.readObject());
//        return studentUserList;
//    }

    /**
     * 自定义成员方法实现客户端管理员登录的功能
     */
    private boolean clientManagerLogin() throws IOException, ClassNotFoundException {
        //1.准备管理员登录的相关数据
        System.out.println("请输入管理员的账户信息：");
        String userName = gteScanner().next();
        System.out.println("请输入管理员的密码信息：");
        String password = gteScanner().next();
        UserMessage tum = new UserMessage("managerCheck",new User(userName,password));
        //2.将UserMessage类的对象通过对象输出流发送到服务器
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送管理员账户信息成功！");
        //3接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        if("success".equals(tum.getType())){
            System.out.println("登陆成功，欢迎使用！");
            return true;
        }else{
            System.out.println("用户名或密码错误！");
            return false;
        }
    }
}
